home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / BuildALPHA.rexx < prev    next >
OS/2 REXX Batch file  |  1995-06-05  |  14KB  |  538 lines

  1. /* $VER: BuildALPHA.rexx 8.5 (5.6.95)
  2. copyright 1990-95 Richard Lee Stockton
  3.        FREELY DISTRIBUTABLE
  4.  
  5. Build the main filelist "Lists/Files", and alphabetically
  6. sorted filelist "Lists/Files.ALPHA" from the filenotes.
  7.  
  8. KeyWords field (if empty) is built from the long description (if any).
  9. Bytes field is corrected (if necessary) to match real filesize.
  10.  
  11. If COLLECT is passed as an argument, will collect files that have
  12. no file description and construct descriptions for them using the
  13. filecomment of the file (if any) for note data. Note that the
  14. filecomment may then be blanked so it won't interfere with displays.
  15.  
  16. If NOFILEBUILD is passed as an argument, only the alpha list is built.
  17. You may NOT use both flags at once.
  18. */
  19.  
  20. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  21. IF ~SHOW('P','QuickSortPort') THEN CALL GETOUT(666)
  22.  
  23. ARG baflags .
  24.  
  25. IF baflags='?' THEN
  26.   DO
  27.     DO i=1 TO 14
  28.       SAY SOURCELINE(i)
  29.     END
  30.     EXIT
  31.   END
  32. CALL OPENPORT('BUILDALPHA')
  33.  
  34. figarg='s:CONFIG.BBS'
  35. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  36. x=OPEN(f,figarg,'R')
  37. IF x=0 THEN
  38.   DO
  39.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  40.     EXIT(20)
  41.   END
  42. lynes.=''
  43. DO i=1 TO 8
  44.   lynes.i=READLN(f)
  45. END
  46. CALL CLOSE(f)
  47.  
  48. compos=POS('/*',lynes.1)
  49. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  50.  
  51. bbsname = STRIP(lynes.1)
  52. sysop   = WORD(lynes.2,1)
  53. bbspath = WORD(lynes.6,1)
  54. IF ~EXISTS(bbspath) THEN
  55.   DO
  56.     SAY 'The bbspath, 'bbspath', does not exist!'
  57.     EXIT(21)
  58.   END
  59. testchar=RIGHT(bbspath,1)
  60. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  61. libpath = WORD(lynes.8,1)
  62. IF ~EXISTS(libpath) THEN
  63.   DO
  64.     SAY 'The library path, 'libpath', does not exist!'
  65.     EXIT(22)
  66.   END
  67. testchar=RIGHT(libpath,1)
  68. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  69.  
  70. IF SHOW('P','BBBBS') THEN CALL PRAGMA('P',-2)
  71. etime=TIME('R')
  72.  
  73. IF baflags='COLLECT' THEN
  74.   DO
  75.     OPTIONS PROMPT 'Shall I clear each filecomment after using in the description? (Yn) > '
  76.     PULL clearflag .
  77.     clearflag=LEFT(STRIP(clearflag),1)
  78.     SAY 'Searching for files with no file descriptions...'
  79.     filelibs=SHOWDIR(libpath,'D')
  80.     DO i=1 TO WORDS(filelibs)
  81.       thislib=WORD(filelibs,i)
  82.       realfiles=SHOWDIR(libpath||thislib)
  83.       DO j=1 TO WORDS(realfiles)
  84.         thisfile=WORD(realfiles,j)
  85.         IF ~EXISTS(bbspath'FileNotes/'thislib'/'thisfile) THEN CALL makenote
  86.       END
  87.     END
  88.     IF ~DATATYPE(lastfile,'N') THEN
  89.       DO
  90.         SAY 'All files in the libraries have descriptions.'
  91.         EXIT
  92.       END
  93.   END
  94.  
  95. x=OPEN(f,bbspath'Lists/Libraries','R')
  96. IF x=0 THEN CALL GETOUT(24);
  97. libs.=''
  98. DO i=1
  99.   line=READLN(f)
  100.   IF EOF(f) THEN LEAVE i
  101.   indx=WORD(line,1)
  102.   IF ~DATATYPE(indx,'W') THEN ITERATE i
  103.   libs.indx=WORD(line,2)
  104. END
  105. CALL CLOSE(f)
  106.  
  107. f.=''
  108. cnt.=0
  109. latest=0
  110. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA.alpha','W') THEN CALL GETOUT(26)
  111. IF baflags='NOFILEBUILD' THEN SAY 'Rebuilding Files.ALPHA...'
  112. ELSE SAY 'Rebuilding Filelists...'
  113. DO i=1 TO 99
  114.   IF libs.i='' THEN ITERATE i
  115.   CALL MAKEDIR(libpath||libs.i)
  116.   notes=SHOWDIR(bbspath'FileNotes/'libs.i,'F')
  117.   DO j=1 TO WORDS(notes)
  118.     note=WORD(notes,j)
  119.     file=libpath||libs.i'/'note
  120.     IF ~EXISTS(file) THEN
  121.       DO
  122.         temp=WORD(STATEF(bbspath'FileNotes/'libs.i'/'note),8)
  123.         IF temp~='' THEN file=temp
  124.         IF ~EXISTS(file) THEN SAY file 'does not exist.'
  125.       END
  126.     IF OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')=0 THEN
  127.       DO
  128.         CALL CLOSE(f)
  129.         IF EXISTS(file) THEN
  130.           SAY 'Could not open file description for' libs.i'/'note
  131.         ELSE SAY file 'does not exist.'
  132.         ITERATE j
  133.       END
  134.     line=READLN(f)
  135.     PARSE VAR line 'File:' filenum 'KeyWords:' keywords
  136.     IF ~DATATYPE(filenum,'W') THEN
  137.       DO
  138.         CALL CLOSE(f)
  139.         SAY '*** Bad file description!' libs.i'/'note
  140.         SAY line
  141.         ITERATE j
  142.       END
  143.     filenum=filenum%1
  144.     line=READLN(f)
  145.     name=WORD(line,2)
  146.     notebytes=WORD(line,4)
  147.     IF LENGTH(keywords)<3 THEN
  148.       DO
  149.         CALL READLN(f)
  150.         CALL READLN(f)
  151.         line=READLN(f)
  152.         CALL CLOSE(f)
  153.         IF line~='' THEN
  154.           DO
  155.             keywords=STRIP(LEFT(line,32))
  156.             CALL fixkeywords()
  157.           END
  158.       END
  159.     ELSE CALL CLOSE(f)
  160.     IF POS('1B'x,keywords)>0 THEN
  161.       DO
  162.         keywords=strip_ansi(keywords)
  163.         CALL fixkeywords()
  164.       END
  165.     bytes=0
  166.     IF EXISTS(file) THEN
  167.       DO
  168.         bytes=WORD(STATEF(file),2)
  169.         IF bytes~=notebytes THEN CALL fixbytes()
  170.       END
  171.     ELSE bytes=notebytes
  172.     IF UPPER(name)~=UPPER(note) THEN CALL fixname()
  173.     IF f.filenum~='' THEN
  174.       DO
  175.         SAY 'Duplicate file numbers! 'filenum f.filenum '&' libs.i name
  176.         IF OPEN(na,bbspath'Numbers/LastFile','R')~=0 THEN
  177.           DO
  178.             newnum=READLN(na)
  179.             CALL CLOSE(na)
  180.             IF DATATYPE(newnum,'W') THEN
  181.               DO
  182.                 filenum=newnum+1
  183.                 CALL fixnumber()
  184.                 IF baflags='NOFILEBUILD' THEN
  185.                   DO
  186.                     IF OPEN(na,bbspath'BBS_TEXT/Files','A')~=0 THEN
  187.                       DO
  188.                         CALL WRITELN(na,filenum libs.i note)
  189.                         CALL CLOSE(na)
  190.                       END
  191.                   END
  192.                 IF OPEN(na,bbspath'Numbers/LastFile','W')~=0 THEN
  193.                   DO
  194.                     CALL WRITELN(na,filenum)
  195.                     CALL CLOSE(na)
  196.                   END
  197.               END
  198.           END
  199.       END
  200.     IF baflags~='NOFILEBUILD' THEN f.filenum=libs.i name
  201.     IF filenum>latest THEN latest=filenum
  202.     alpha=LEFT(name,22-LENGTH(bytes)) bytes RIGHT(filenum,5) RIGHT(i,2)
  203.     alpha=alpha LEFT(libs.i,12) TRIM(LEFT(STRIP(keywords),32))
  204.     CALL WRITELN(a,alpha)
  205.     cnt.i=cnt.i+1
  206.   END
  207.   lf1=libpath||libs.i'/.'STRIP(LEFT(libs.i,15))
  208.   CALL DELETE(lf1)
  209.   flg='W'
  210.   IF EXISTS(libpath||libs.i'.txt') THEN
  211.     DO
  212.       ADDRESS COMMAND 'COPY' libpath||libs.i'.txt' lf1
  213.       flg='A'
  214.     END
  215.   IF listOPEN(f,lf1,flg)=0 THEN ITERATE j
  216.   IF flg='A' THEN CALL WRITELN(f,'')
  217.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  218.   CALL WRITELN(f,LEFT('=',77,'='))
  219.   CALL CLOSE(f)
  220. END
  221. CALL CLOSE(a)
  222.  
  223. CALL SETCLIP('BBS_UPLOAD','NO')
  224.  
  225. IF baflags~='NOFILEBUILD' THEN
  226.   DO
  227.     IF ~listOPEN(f,bbspath'Lists/Files','W') THEN CALL GETOUT(27)
  228.     CALL SETCLIP('BBS_UPLOAD','NO')
  229.     SAY 'Saving Lists/Files...'
  230.     DO i=1 TO latest
  231.       IF f.i='' THEN ITERATE i
  232.       CALL WRITELN(f,i f.i)
  233.     END
  234.     CALL CLOSE(f)
  235.   END
  236. IF EXISTS('c:shellsort') THEN
  237.   DO
  238.     SAY 'Sorting...'
  239.     temp=bbspath'Lists/Files.ALPHA.alpha'
  240.     temp='c:shellsort -c' temp temp
  241.     ADDRESS COMMAND temp
  242.     CALL DELAY(28)
  243.   END
  244. a.=''
  245. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA.alpha','R') THEN CALL GETOUT(28)
  246. SAY 'Loading Lists/Files.ALPHA.alpha...'
  247. DO i=1
  248.   line=READLN(f)
  249.   IF EOF(f) THEN LEAVE i
  250.   a.i=line
  251. END
  252. CALL CLOSE(f)
  253. a.0=i-1
  254. IF ~EXISTS('c:shellsort') THEN
  255.   DO
  256.     SAY 'Sorting...'
  257.     CALL QSORT(1,a.0,a)
  258.   END
  259. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','W') THEN CALL GETOUT(29)
  260. CALL DELETE(bbspath'Lists/Files.ALPHA.alpha')
  261. SAY 'Saving Lists/Files.ALPHA and individual library lists...'
  262. DO i=1 TO a.0
  263.   IF a.i='' THEN ITERATE i
  264.   CALL WRITELN(f,a.i)
  265.   lnum=WORD(a.i,4)
  266.   IF ~DATATYPE(lnum,'W') THEN ITERATE i
  267.   flg='W'
  268.   lf=libpath||libs.lnum'/.'STRIP(LEFT(libs.lnum,15))
  269.   IF EXISTS(lf) THEN flg='A'
  270.   IF ~OPEN(a,lf,flg) THEN ITERATE i
  271.   CALL WRITELN(a,a.i)
  272.   CALL CLOSE(a)
  273. END
  274. CALL CLOSE(f)
  275.  
  276. CALL SETCLIP('BBS_UPLOAD')
  277.  
  278. SAY 'Adding taglines to individual lists...'
  279. DO tt=1 TO 99
  280.   IF libs.tt='' THEN ITERATE tt
  281.   dname='.'STRIP(LEFT(libs.tt,15))
  282.   x=OPEN(f,libpath||libs.tt'/'dname,'A')
  283.   IF x~=0 THEN
  284.     DO
  285.       CALL WRITELN(f,LEFT('-',77,'-'))
  286.       temp='file'
  287.       IF cnt.tt~=1 THEN temp=temp's'
  288.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  289.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  290.       CALL WRITELN(f,temp)
  291.       CALL CLOSE(f)
  292.     END
  293.   CALL MAKEDIR(bbspath'FileNotes/'libs.tt)
  294.   fnote=bbspath'FileNotes/'libs.tt'/'dname
  295.   lynes.=''
  296.   lynes.0=5
  297.   x=OPEN(f,fnote,'R')
  298.   IF x~=0 THEN
  299.     DO
  300.       DO k=1
  301.         line=READLN(f)
  302.         IF EOF(f) THEN LEAVE k
  303.         lynes.k=line
  304.       END
  305.       CALL CLOSE(f)
  306.       lynes.0=k-1
  307.     END
  308.   finfo=STATEF(libpath||libs.tt'/.'STRIP(LEFT(libs.tt,15)))
  309.   bt=WORD(finfo,2)
  310.   dl=WORD(lynes.2,7)
  311.   IF ~DATATYPE(dl,'W') THEN dl=0
  312.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  313.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  314.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'libs.tt
  315.   lynes.4=LEFT('',74,'=')
  316.   IF lynes.5='' THEN
  317.     lynes.5='Up to the minute alphabetical filelist of the' libs.tt 'library.'
  318.   IF OPEN(f,fnote,'W')~=0 THEN
  319.     DO
  320.       DO k=1 TO lynes.0
  321.         CALL WRITELN(f,lynes.k)
  322.       END
  323.       CALL CLOSE(f)
  324.     END
  325. END
  326.  
  327. IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  328. IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  329. CALL GETOUT(0)
  330. EXIT
  331.  
  332.  
  333. /* sub-routines */
  334.  
  335. GETOUT:
  336. ARG outnum .
  337. IF outnum>0 THEN SAY 'Error number' outnum'.  Refer to BuildALPHA.rexx'
  338. mins=TIME('E')%60
  339. secs=TRUNC(TIME('E')//60)
  340. IF secs<10 THEN secs='0'secs
  341. SAY 'Elapsed time file building =' mins':'secs
  342. CALL SETCLIP('BBS_UPLOAD')
  343. EXIT(outnum);
  344.  
  345.  
  346. strip_ansi:
  347. PARSE ARG aline 
  348. n=POS('1B'x,aline)
  349. DO WHILE n>0
  350.   DO k=2
  351.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  352.       leave k
  353.   END
  354.   aline=DELSTR(aline,n,k+1)
  355.   n=POS('1B'x,aline)
  356. END
  357. RETURN aline
  358.  
  359.  
  360. fixnumber:
  361. SAY 'Adding' libs.i name 'to the filelists as file number' filenum'...'
  362. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')
  363. IF x=0 THEN
  364.   DO
  365.     SAY note 'failed to open for reading! (fixing filenumber)'
  366.     RETURN
  367.   END
  368. text.=''
  369. DO ii=1
  370.   x=READLN(F)
  371.   IF EOF(f) THEN LEAVE ii
  372.   text.ii=x
  373. END
  374. CALL CLOSE(f)
  375. text.0=ii-1
  376. text.1=OVERLAY(filenum,text.1,7,5)
  377. CALL DELAY(50)
  378. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'W')
  379. IF x=0 THEN
  380.   DO
  381.     SAY note 'failed to open for writing! (fixing filenumber)'
  382.     RETURN
  383.   END
  384. DO ii=1 TO text.0
  385.   CALL WRITELN(f,text.ii)
  386. END
  387. CALL CLOSE(f)
  388. RETURN
  389.  
  390.  
  391. fixname:
  392. SAY 'Name: field does not match actual filename!'
  393. SAY 'Changing Name: 'name' in file description to 'note
  394. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')
  395. IF x=0 THEN
  396.   DO
  397.     SAY note 'failed to open for reading! (fixing name)'
  398.     RETURN
  399.   END
  400. text.=''
  401. DO ii=1
  402.   x=READLN(F)
  403.   IF EOF(f) THEN LEAVE ii
  404.   text.ii=x
  405. END
  406. CALL CLOSE(f)
  407. text.0=ii-1
  408. text.2=OVERLAY(note,text.2,7,27)
  409. CALL DELAY(50)
  410. x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'W')
  411. IF x=0 THEN
  412.   DO
  413.     SAY note 'failed to open for writing! (fixing name)'
  414.     RETURN
  415.   END
  416. DO ii=1 TO text.0
  417.   CALL WRITELN(f,text.ii)
  418. END
  419. CALL CLOSE(f)
  420. name=note
  421. RETURN
  422.  
  423.  
  424. fixkeywords:
  425. SAY 'Fixing keywords field for' libs.i'/'note
  426. fixfile=bbspath'FileNotes/'libs.i'/'note
  427. finfo=STATEF(fixfile)
  428. comment=''
  429. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  430. fxlines.=''
  431. x=OPEN(kf,fixfile,'R')
  432. IF x=0 THEN
  433.   DO
  434.     SAY 'Failed to open' fixfile 'for reading! (keywords adjustment)'
  435.     RETURN
  436.   END
  437. DO fx=1
  438.   line=READLN(kf)
  439.   IF EOF(kf) THEN LEAVE fx
  440.   fxlines.fx=line
  441. END
  442. CALL CLOSE(kf)
  443. fxlines.0=fx-1
  444. fxlines.1='File:' LEFT(WORD(fxlines.1,2),5) 'KeyWords:' keywords
  445. x=OPEN(kf,fixfile,'W')
  446. IF x=0 THEN
  447.   DO
  448.     SAY 'Failed to open' fixfile 'for writing! (keywords adjustment)'
  449.     RETURN
  450.   END
  451. DO fx=1 TO fxlines.0
  452.   CALL WRITELN(kf,fxlines.fx)
  453. END
  454. CALL CLOSE(kf)
  455. IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
  456. RETURN
  457.  
  458.  
  459. fixbytes:
  460. SAY 'Fixing bytes field for' libs.i'/'note
  461. fixfile=bbspath'FileNotes/'libs.i'/'note
  462. finfo=STATEF(fixfile)
  463. comment=''
  464. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  465. fxlines.=''
  466. x=OPEN(f,fixfile,'R')
  467. IF x=0 THEN
  468.   DO
  469.     SAY 'Failed to open' fixfile 'for reading! (byte adjustment)'
  470.     RETURN
  471.   END
  472. DO fx=1
  473.   line=READLN(f)
  474.   IF EOF(f) THEN LEAVE fx
  475.   fxlines.fx=line
  476. END
  477. CALL CLOSE(f)
  478. fxlines.0=fx-1
  479. fxlines.2=OVERLAY(bytes,fxlines.2,WORDINDEX(fxlines.2,4),LENGTH(bytes)+1)
  480. x=OPEN(f,fixfile,'W')
  481. IF x=0 THEN
  482.   DO
  483.     SAY 'Failed to open' fixfile 'for writing! (byte adjustment)'
  484.     RETURN
  485.   END
  486. DO fx=1 TO fxlines.0
  487.   CALL WRITELN(f,fxlines.fx)
  488. END
  489. CALL CLOSE(f)
  490. IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
  491. RETURN
  492.  
  493.  
  494. makenote:
  495. CALL MAKEDIR(bbspath'FileNotes/'thislib)
  496. x=OPEN(f,bbspath'FileNotes/'thislib'/'thisfile,'W')
  497. IF x=0 THEN
  498.   DO
  499.     SAY bbspath'FileNotes/'thislib'/'thisfile 'failed to open for writing!'
  500.     RETURN
  501.   END
  502. x=OPEN(ff,bbspath'Numbers/LastFile','R')
  503. IF x~=0 THEN lastfile=READLN(ff)+1
  504. ELSE lastfile=1
  505. CALL CLOSE(ff)
  506. ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastFile 'lastfile
  507. finfo=STATEF(libpath||thislib'/'thisfile)
  508. bytes=WORD(finfo,2)
  509. comment=''
  510. IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
  511. CALL WRITELN(f,'File: 'LEFT(lastfile,5)' KeyWords:' STRIP(LEFT(comment,32)))
  512. CALL WRITELN(f,'Name: 'LEFT(thisfile,27)' Size: 'bytes' bytes   Downloads: 0')
  513. CALL WRITELN(f,'From: 'LEFT(sysop,27)' Date: 'DATE() TIME('C')'  Lib: 'thislib)
  514. CALL WRITELN(f,LEFT('',74,'='))
  515. IF LENGTH(comment)>31 THEN CALL WRITELN(f,comment)
  516. CALL CLOSE(f)
  517. IF comment~='' & clearflag~='N' THEN
  518.   ADDRESS COMMAND 'filenote' libpath||thislib'/'thisfile '22'x||'22'x
  519. SAY 'Added' thisfile 'to the' thislib 'library.'
  520. RETURN
  521.  
  522.  
  523. listOPEN:
  524. PARSE ARG fh,listfile,flag
  525. DO li=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  526.   IF li//4=0 THEN SAY 'Waiting' (60-li)*5 'more seconds for' listfile 'to become available...'
  527.   CALL DELAY(250)
  528. END
  529. IF li>59 THEN
  530.   DO
  531.     SAY '*** unable to access' listfile 'list.'
  532.     RETURN 0
  533.   END
  534. RETURN 1
  535.  
  536.  
  537. /* BuildALPHA.rexx */
  538.